import os
from langchain.agents import tool
from email.mime.text import MIMEText
from langchain_core.tools import BaseTool
from pydantic import BaseModel,Field,ConfigDict
from typing import Type,Any
import smtplib
from dotenv import load_dotenv


#1 先定义一个数据模型
class EmailInput(BaseModel):
    to_email:str = Field(...,description="收件人的邮箱")
    subject:str = Field(...,description="邮件的标题")
    content:str = Field(...,description="邮件的内容")
#2 配置类管理，表示模型字段的配置，表示智能体工具类
class EmailTool(BaseTool):
        # arbitrary_types_allowed=True：允许数据模型采用任意python的数据类型
        model_config = ConfigDict(arbitrary_types_allowed=True)

        # 3 定义初始化方法
        def __init__(self,**kwargs:Any):
            super().__init__(
                name="get_email_tool",
                description = "用于发送邮件信息的，输入的参数应该是收件人的邮箱，邮件标题，邮件内容",
                **kwargs
            )
        # 4 定义智能体的工具
        args_schema : Type[BaseModel] = EmailInput
        # 5 定义执行方法
        def _run(self,to_email:str,subject:str,content:str):
            load_dotenv()
            # 创建邮件对象
            msg = MIMEText(content)
            # 收件人邮箱
            msg['To'] = to_email
            # 发件人邮箱
            msg["From"] = os.getenv("email_user")
            # 邮件主题
            msg["Subject"] = subject
            try:
                # 创建SMTP对象
                smtp = smtplib.SMTP_SSL(host=os.getenv("email_host"), port=465)
                # 登录邮箱
                smtp.login(os.getenv("email_user"), os.getenv("email_password"))
                # 发送邮件
                # os.getenv("email_user") 发件人，to_email 收件人，msg 邮件内容
                smtp.sendmail(os.getenv("email_user"), to_email, msg.as_string())

                return "邮件发送成功"
            except Exception as e:
                print(e)
                return "邮件发送失败"
